﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SistemaBastanteo.Persistencia;
using SistemaBastanteo.Dominio;

namespace SistemaBastanteo.Negocio
{
    public class MantenimientoServiceImpl : IMantenimientoService
    {

        IClienteDAO clienteDAO = null;
        ITipoEmpresaDAO tipoEmpresaDAO = null;
        IPoderDAO poderDAO = null;
        IRepresentanteDAO representanteDAO = null;
        ITipoDocumentoDAO tipoDocumentoDAO = null;

        public Dominio.Cliente RegistrarCliente(string ruc, string razonSocial, DateTime inicio, int empleados, int tipo)
        {

            //Exception si falta algun dato requerido
            if (ruc == null || razonSocial == null || inicio == null || empleados<=0 || tipo<=0)
                throw new DatosInsuficientesException("Faltan Datos para crear Cliente");
            
            if (clienteDAO.ObtenerClientePorRUC(ruc).Count > 0)
                throw new EntidadRepetidaException("Ya Existen un Cliente con el mismo Ruc");

            Cliente clienteACrear = new Cliente();
            clienteACrear.Ruc = ruc;
            clienteACrear.RazonSocial = razonSocial;
            clienteACrear.Tipo = tipoEmpresaDAO.Obtener(tipo);
            clienteACrear.Inicio = inicio;
            clienteACrear.Empleados = empleados;
            return clienteDAO.Crear(clienteACrear);
        }

        public Dominio.Representante RegistrarRepresentante(int tipoDocumento, string numeroDocumento, string nombre, string apellidos, string cargo, string grupo, int cliente)
        {
            //Exception si falta algun dato requerido
            if (tipoDocumento <= 0 || numeroDocumento == null || nombre == null || apellidos == null || cargo == null || grupo == null || cliente <= 0)
                throw new DatosInsuficientesException("Faltan Datos para crear Representante");

            if (representanteDAO.ObtenerRepresentantePorTipoYDocumento(tipoDocumento, numeroDocumento).Count > 0)
                throw new EntidadRepetidaException("Ya Existen un Representante con el mismo Tipo y Numero de Documento");

            Representante representanteACrear = new Representante();
            representanteACrear.TipoDocumento = tipoDocumentoDAO.Obtener(tipoDocumento);
            representanteACrear.Documento = numeroDocumento;
            representanteACrear.Nombres = nombre;
            representanteACrear.Apellidos = apellidos;
            representanteACrear.Cargo = cargo;
            representanteACrear.Grupo = grupo;
            representanteACrear.Cliente = clienteDAO.Obtener(cliente);
            return representanteDAO.Crear(representanteACrear);
            
        }

        public Dominio.Poder RegistrarPoder(string codigoCorto, string nombre, string tipoProducto)
        {
          //  throw new NotImplementedException();
            //Exception si falta algun dato requerido
            if (codigoCorto == null || nombre == null || tipoProducto == null)
                throw new DatosInsuficientesException("Faltan Datos para crear Poder");

            if (poderDAO.ListarxCodigoCorto(codigoCorto).Count > 0)
                throw new EntidadRepetidaException("Ya Existen un poder con el mismo codigoCorto");

            Poder poderACrear = new Poder();
            poderACrear.CodigoCorto = codigoCorto;
            poderACrear.Descripcion = nombre;
            poderACrear.TipoProducto = tipoProducto;

            return poderDAO.Crear(poderACrear);
            //  throw new NotImplementedException();
        }

        public Dominio.TipoDocumento RegistrarTipoDocumento(string descripcion)
        {
            //  throw new NotImplementedException();
            //Exception si falta algun dato requerido
            if (descripcion == null)
                throw new DatosInsuficientesException("Faltan Datos para crear Tipo Documento");

            TipoDocumento tipoACrear = new TipoDocumento();
            tipoACrear.Descripcion = descripcion;
            return tipoDocumentoDAO.Crear(tipoACrear);
            //  throw new NotImplementedException();
        }

        public Dominio.TipoEmpresa RegistrarTipoEmpresa(string abreviacion)
        {
            //  throw new NotImplementedException();
            //Exception si falta algun dato requerido
            if (abreviacion == null)
                throw new DatosInsuficientesException("Faltan Datos para crear Tipo de Empresa");

            TipoEmpresa tipoACrear = new TipoEmpresa();
            tipoACrear.Abreviacion = abreviacion;
            return tipoEmpresaDAO.Crear(tipoACrear);
            //  throw new NotImplementedException();
        }

        public Dominio.Cliente ObtenerCliente(int codigo)
        {
            return clienteDAO.Obtener(codigo);
        }

        public ICollection<Dominio.Cliente> ListarCliente()
        {
            return clienteDAO.ListarTodos();
        }

        public ICollection<Dominio.Cliente> ObtenerClientePorRUC(string ruc)
        {
            return clienteDAO.ObtenerClientePorRUC(ruc);
        }

        public Dominio.Representante ObtenerRepresentante(int codigo)
        {
            return representanteDAO.Obtener(codigo); 
        }

        public ICollection<Dominio.Representante> ObtenerRepresentantePorRucYTipo(string ruc, int tipo)
        {
            return representanteDAO.ObtenerRepresentantePorTipoYDocumento(tipo, ruc);
        }

        public Dominio.Poder ObtenerPoder(int codigo)
        {
            return poderDAO.Obtener(codigo);
        }

        public ICollection<Dominio.Poder> ObtenerPoderPorCodigoCorto(string codigoCorto)
        {
            return poderDAO.ListarxCodigoCorto(codigoCorto);
        }

        public Dominio.TipoEmpresa ObtenerTipoEmpresa(int codigo)
        {
            throw new NotImplementedException();
        }

        public Dominio.TipoDocumento ObtenerTipoDocumento(int codigo)
        {
            return tipoDocumentoDAO.Obtener(codigo);
        }

        public ICollection<Dominio.TipoEmpresa> ListarTipoEmpresa()
        {
            return tipoEmpresaDAO.ListarTodos();
        }

        public ICollection<Dominio.TipoDocumento> ListarTipoDocumento()
        {
            return tipoDocumentoDAO.ListarTodos();
        }

        public ICollection<Dominio.Poder> ListarPoder()
        {
            return poderDAO.ListarTodos();
        }

        public ICollection<Dominio.Representante> ListarRepresentante(int cliente)
        {
            return representanteDAO.ObtenerRepresentantePorCliente(cliente);
        }

    }
}